<?php

namespace rongyun\methods;

use yii\base\Exception;

class Group extends \rongyun\components\BaseTransport {

    const GROUP_CREATE = '/group/create.json';

    /**
     * 创建群组
     * 创建群组，并将用户加入该群组，用户将可以收到该群的消息，同一用户最多可加入 500 个群，每个群最大至 3000 人，
     * App 内的群组数量没有限制
     * 注：其实本方法是加入群组方法 /group/join 的别名。） 
     * 
     * @param $userId 要加入群的用户Id。（必传）
     * @param $groupId 创建群组Id。（必传）
     * @param $groupName 群组Id对应的名称。（必传）
     * @return boolean|array
     */
    public function create($userId, $groupId, $groupName) {
        if (empty($userId) || empty($groupId) || empty($groupName)) {
            throw new Exception('Paramer "userId" and "groupId" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
            'groupName' => $groupName
        ];
        return $this->http(static::GROUP_CREATE, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_SYNC = '/group/sync.json';

    /**
     * 同步用户所属群组方法
     * 当第一次连接融云服务器时，需要向融云服务器提交 userId 对应的用户当前所加入的所有群组
     * 此接口主要为防止应用中用户群信息同融云已知的用户所属群信息不同步。
     * 
     * @param $userId 被同步群信息的用户 Id。（必传）
     * @param $groupInfo 该用户的群信息，如群 Id 已经存在，则不会刷新对应群组名称，如果想刷新群组名称请调用刷新群组信息方法
     * @return boolean|array
     */
    public function sync($userId, $groupInfo) {
        if (empty($userId) || empty($groupInfo)) {
            throw new Exception('Paramer "userId" and "groupInfo" is required');
        }
        $params = [
            'userId' => $userId,
        ];
        foreach ($groupInfo as $key => $value) {
            $params['group[' . $key . ']'] = $value;
        }
        return $this->http(static::GROUP_SYNC, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_REFRESH = '/group/refresh.json';

    /**
     * 刷新群组信息方法
     * @param $groupId 群组Id（必传）
     * @param $groupName 群名称（必传）
     * @return boolean|array
     */
    public function refresh($groupId, $groupName) {
        if (empty($groupId) || empty($groupName)) {
            throw new Exception('Paramer "groupId" and "groupName" is required');
        }
        $params = [
            'groupId' => $groupId,
            'groupName' => $groupName
        ];
        return $this->http(static::GROUP_REFRESH, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_JOIN = '/group/join.json';

    /**
     * 将用户加入指定群组
     * 用户将可以收到该群的消息，同一用户最多可加入 500 个群，每个群最大至 3000 人。 
     * 
     * @param $userId 要加入群的用户 Id，可提交多个，最多不超过 1000 个（必传）
     * @param $groupId 要加入的群 Id。（必传）
     * @param $groupName 要加入的群 Id 对应的名称（必传）
     * @return boolean|array
     */
    public function join($userId, $groupId, $groupName) {
        if (empty($userId) || empty($groupId) || empty($groupName)) {
            throw new Exception('Paramer "userId" and "groupId" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
            'groupName' => $groupName
        ];
        return $this->http(static::GROUP_JOIN, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_USER_QUERY = '/group/user/query.json';

    /**
     * 查询群成员方法 
     * 
     * @param $groupId 群组Id（必传）
     * @return boolean|array
     */
    public function queryUser($groupId) {
        if (empty($groupId)) {
            throw new Exception('Paramer "groupId" is required');
        }
        $params = [
            'groupId' => $groupId
        ];
        return $this->http(static::GROUP_USER_QUERY, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_QUIT = '/group/quit.json';

    /**
     * 退出群组方法（将用户从群中移除，不再接收该群组的消息.） 
     * 
     * @param $userId 要退出群的用户 Id.（必传）
     * @param $groupId 要退出的群 Id.（必传）
     * @return boolean|array
     */
    public function quit($userId, $groupId) {
        if (empty($userId) || empty($groupId)) {
            throw new Exception('Paramer "userId" and "groupId" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
        ];
        return $this->http(static::GROUP_QUIT, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_USER_GAG_ADD = '/group/user/gag/add.json';

    /**
     * 添加禁言群成员方法
     * 在 App 中如果不想让某一用户在群中发言时，可将此用户在群组中禁言，被禁言用户可以接收查看群组中用户聊天信息，但不能发送消息。 
     * 
     * @param $userId 用户 Id。（必传）
     * @param $groupId 群组 Id。（必传）
     * @param $minute 禁言时长，以分钟为单位，最大值为43200分钟。（必传）
     * @return boolean|array
     */
    public function addGagUser($userId, $groupId, $minute) {
        if (empty($userId) || empty($groupId) || empty($minute)) {
            throw new Exception('Paramer "userId" and "userId" and "minute" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
            'minute' => $minute
        ];
        return $this->http(static::GROUP_USER_GAG_ADD, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_USER_GAG_LIST = '/group/user/gag/list.json';

    /**
     * 查询被禁言群成员方法 
     * 
     * @param $groupId 群组Id。（必传）
     * @return boolean|array
     */
    public function lisGagUser($groupId) {
        if (empty($groupId)) {
            throw new Exception('Paramer "groupId" is required');
        }
        $params = [
            'groupId' => $groupId
        ];
        return $this->http(static::GROUP_USER_GAG_LIST, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_USER_GAG_ROLLBACK = '/group/user/gag/rollback.json';

    /**
     * 移除禁言群成员方法 
     * 
     * @param $userId 用户Id。支持同时移除多个群成员（必传）
     * @param $groupId 群组Id。（必传）
     * @return boolean|array
     */
    public function rollBackGagUser($userId, $groupId) {
        if (empty($userId) || empty($groupId)) {
            throw new Exception('Paramer "userId" and "userId" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
        ];
        return $this->http(static::GROUP_USER_GAG_ROLLBACK, $params, 'urlencoded', 'im', 'POST');
    }

    const GROUP_DISMISS = '/group/dismiss.json';

    /**
     * 解散群组方法
     * 将该群解散，所有用户都无法再接收该群的消息
     * 
     * @param $userId 操作解散群的用户 Id。（必传）
     * @param $groupId 要解散的群 Id。（必传）
     * @return boolean|array
     */
    public function dismiss($userId, $groupId) {
        if (empty($userId) || empty($groupId)) {
            throw new Exception('Paramer "userId" and "userId" is required');
        }
        $params = [
            'userId' => $userId,
            'groupId' => $groupId,
        ];
        return $this->http(static::GROUP_DISMISS, $params, 'urlencoded', 'im', 'POST');
    }

}
